|
|
Tom Melly wrote:
> Such an approach might work for simple primitives, but would fail on
> anything more complex - how do you define a sensible reference point for a
> blob?
I don't think anything is impossible - until proven, of course. My suggestion
for blob as well as CSG objects or other complex objects is the use of a
.subobject[] property, along with a .subobject_count. An example:
#declare ABlob = blob {
threshold .65
sphere { <.5,0,0>, .8, 1 pigment {Blue} }
sphere { <-.5,0,0>,.8, 1 pigment {Pink} }
finish { phong 1 }
}
The blob object lends itself nicely to OO, like this:
ABlob
-subobject_count
-subobject[0]
-type //sphere or cylinder
-origin // as it is a sphere
-radius
-strength
-pigment
-subobject[1]
..
-finish
(If some of the blob items had been a cylinder, there had been .top and .bottom
properties of subobject[0] instead of .origin.)
This means we can access our blob as in this example:
#declare i=0;
#while(i<ABlob.subobject_count - 1)
#if(ABlob.subobject[i].type=0) // type 0 = sphere, 1 = cylinder
// do something using subobject[i].origin
#else
// do something using subobject[i].top, subobject[i].bottom
#end
#declare ABlob.subobject[i].radius = ABlob.subobject[i].radius + 1;
#declare ABlob.subobject[i].strength = ABlob.subobject[i].strength + i / 10;
#declare i=i+1;
#end
A CSG example:
#declare ACSG = difference{
box{1,-1}
difference{
sphere{0, 1}
plane{y, 0}
translate <1,0,0>
}
}
ACSG
-subobject_count
-subobject[0] //the box
-subobject[1] //the sphere - plane difference
-subobject_count
-subobject[0] // the sphere
-subobject[1] // the plane
We could now access the plane down in the hierarchy by
ACSG.subobject[1].subobject[1]
Similar for meshes, unions of bicubic patches, etc.
----------------------------------------------------
Mikael Carneholm, B.Sc.
Dep. of Computer Science and Business Administration
Personal homepage:
http://www.studenter.hb.se/~arch
E-mail:
sa9### [at] idautbhbse
Post a reply to this message
|
|